﻿using System;
using System.Collections.Generic;
using System.Linq;
using Wicture.EPC.OnlineQueryProxy.Agents;

namespace Wicture.EPC.OnlineQueryProxy
{
    public class WeightedRoundRobinStrategyScheduler : IScheduler
    {
        public string Strategy { get; } = "WeightedRoundRobin";

        private static Random random = new Random();

        /// <summary>
        /// 根据权重值计算范围区间，然后通过随机数来判断所属区间。
        /// 注意：查询结果返回前，不再路由到同一台代理服务器上。
        /// </summary>
        /// <param name="models"></param>
        /// <returns></returns>
        public Agent GetNext(List<Agent> agents)
        {
            if (agents.All(a => a.WeightRange.Start == 0 && a.WeightRange.End == 0))
            {
                throw new Exception($"非法权重值，请检查代理服务器的设置。");
            }

            decimal val = (decimal)random.NextDouble();

            foreach (var agent in agents.Where(a => !a.IsBusy))
            {
                if (val >= agent.WeightRange.Start && val < agent.WeightRange.End)
                {
                    return agent;
                }
            }

            // 如果没有命中（极端边界值或者服务器随机到繁忙的服务器），重新获取。
            return GetNext(agents);
        }
    }
}
